package client.ui;

import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import java.util.HashMap;


//控制舞台的控制器
public class stageController {
     //建立一个专门存储Stage的Map，全部用于存放Stage对象
    private HashMap<String, Stage> stages = new HashMap<String, Stage>();


    /*-----------------------------函数--------------------------------------*/
    //添加舞台到Map中，即addStage(要设定的舞台名字，Stage对象)
    public void addStage(String name, Stage stage) {
        stages.put(name, stage);
    }

    //通过Stage名称从stages中获取Stage对象,stages为存储stage对象的容器
    public Stage getStage(String name) {
        return stages.get(name);
    }

    //primaryStage     主舞台对象，在Start()方法中由JavaFx的API建立
    public void setPrimaryStage(String primaryStageName, Stage primaryStage) {
        this.addStage(primaryStageName, primaryStage);
    }

    //Java语言对方法参数支持一种新写法，叫可变长度参数列表，其语法就是类型后跟...，
    // 表示此处接受的参数为0到多个Object类型的对象，或者是一个Object[];
    //styles    可变参数，init使用的初始化样式资源设置
    //即：loadStage(要加载的窗口的文件，fxml资源地址，样式)
    public Parent loadStage(String name, String resources, StageStyle... styles){
        try {
            //加载FXML资源文件
            FXMLLoader loader = new FXMLLoader(getClass().getResource(resources));

            //应该是从FXML文件中获取界面各种Node，放到排版Pane中
            Pane tempPane = loader.load();

            //通过Loader获取FXML对应的ViewCtr，并将本StageController注入到ViewCtr中
            //将StageController对象注入到每个View控制器中
            //实现了ControlledStage这个接口的controller类都可以像下面一样直接调用
            ControlledStage controlledStage = loader.getController();      //为什么都可以，不论什么类都行 <T> T；  ControlledStage是一个接口
            controlledStage.setStageController(this);                      //即某个fxml的controller设置StageController

            //构造对应的Stage
            Scene tempScene = new Scene(tempPane);
            Stage tempStage = new Stage();
            tempStage.setScene(tempScene);         //舞台构造完毕！！

            //配置initStyle,即舞台的样式
            for (StageStyle style : styles) {
                tempStage.initStyle(style);
            }

            //将设置好的Stage放到HashMap中
            this.addStage(name, tempStage);

            //返回root
            Parent root = loader.getRoot();
            return root;
        }
        catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    public boolean setStage(String name){
        this.getStage(name).show();
        return true;
    }

    public boolean setStage(String show, String close) {
        getStage(close).close();
        setStage(show);
        return true;
    }

    //在Map中删除Stage加载对象
    public boolean unloadStage(String name) {
        if (stages.remove(name) == null) {
            System.out.println("窗口不存在，请检查名称");
            return false;
        } else {
            System.out.println("窗口移除成功");
            return true;
        }
    }
}
